package com.atzxh.guigu.juc.security;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 *  解决集合线程不安全问题
 */
public class ThreadDemo3 {
    public static void main(String[] args) {
//        List<String> list = new ArrayList<>();

        // 创建多个线程
        // 错误信息：Exception in thread "1" Exception in thread "6" java.util.ConcurrentModificationException
//        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                list.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(list);
//            },String.valueOf(i)).start();
//        }

        // 解决方案一：使用vector
//        List<String> vector = new Vector<>();
//        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                vector.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(vector);
//            },String.valueOf(i)).start();
//        }

        // 解决方案二：使用Collection工具类
//        List<String> list = Collections.synchronizedList(new ArrayList<>());
//        List<String> vector = new Vector<>();
//        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                vector.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(vector);
//            },String.valueOf(i)).start();
//        }

        // 解决方案三：使用JUC工具类 CopyOnWriteArrayList(写时复制技术)
//        List<String> list = new CopyOnWriteArrayList<>();
//        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                list.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(list);
//            },String.valueOf(i)).start();
//        }

        // set 线程不安全问题
//        Set<String> set = new HashSet<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread(()->{
//                set.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(set);
//            },String.valueOf(i)).start();
//        }

//        // 解决方案：CopyOnWriteArraySet
//        Set<String> copyOnWriteArraySet = new CopyOnWriteArraySet<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread(()->{
//                copyOnWriteArraySet.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(copyOnWriteArraySet);
//            },String.valueOf(i)).start();
//        }

        // 演示map线程不安全问题
//        Map hashMap = new HashMap<String,Object>();
//        for (int i = 0; i < 30; i++) {
//            int finalI = i;
//            new Thread(()->{
//                hashMap.put(String.valueOf(finalI),UUID.randomUUID().toString().substring(0,8));
//                System.out.println(hashMap);
//            },String.valueOf(i)).start();
//        }

        // 解决方案：
        Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();
        for (int i = 0; i < 30; i++) {
            int finalI = i;
            new Thread(()->{
                concurrentHashMap.put(String.valueOf(finalI),UUID.randomUUID().toString().substring(0,8));
                System.out.println(concurrentHashMap);
            },String.valueOf(i)).start();
        }




    }
}
